简单粗暴,用python生成目录树

在写一些文章时,尤其是一些技术文章或者教程,有时需要将目录结构附在文中,最简单粗暴的方法是自己手动写,但是效率太低,今天就来介绍一下高效率、美观的方法。

1、CMD生成目录树

在 windows 系统中,有一个 CMD 指令可以生成目录树,该条指令是 " tree " 。

1.1 查看帮助

使用 “ Win+R " 快捷键调出 运行 对话框,然后输入 ” CMD “ 回车打开命令行窗口。可以在窗口中输入 ” tree /? " 查看:

以图形显示驱动器或路径的文件夹结构。
TREE [drive:][path] [/F] [/A]
   /F   显示每个文件夹中文件的名称。
   /A   使用 ASCII 字符,而不使用扩展字符。

1.2 作用

从上述帮助文档中可以看出 tree 命令的作用是“以图形显示驱动器或路径的文件夹结构”。

1.3 命令格式

如果我们只想在命令行窗口查看 文件夹目录结构 ,可以使用如下格式:

tree E:\Programming\Python\DesignPattern

输出内容如下:

注意:如果路径中含有空格,则路径需要用双引号包起来,例如 tree "C:\Program Files" 。

上面的指令只能生成文件夹的目录结构,并没有显示文件,我们可以增加 /F 参数来显示文件夹和文件的目录结构:

tree /F E:\Programming\Python\DesignPattern

这样就ok了:

上述命令只是在控制台打印出来了,有时候会有保存到文件的需求,只需对上述命令稍作修改:

tree /F E:\Programming\Python\DesignPattern > dirtree.txt

命令执行之后,在命令行所在目录下会生成一个名为 “ dirtree.txt ” 的文件,目录结构已在其中。

2、Python生成目录树

上述 CMD 方式虽然可以生成目录树,但是并不美观,让我们用 Python 实现。

2.1 标准库pathlib介绍

Python有一个标准文件路径处理库 os.path ,从 Python3.4 开始,Python 又加入了一个标准库 pathlib ,该库是跨平台的、面向对象的路径操作库。

本例使用了 pathlib 中的 Path 类。本文用到的一些基本操作如下:

Path 类的引入:

from pathlib import Path 

创建 Path 对象:

p = Path('E:\Programming\Python\DesignPattern')

获取 p 的路径名称:

print(p.name)

获取 p 目录下的所有文件:

pit = p.iterdir() # 返回一个迭代器,包含p下所有文件夹和文件 

判断 p 是不是文件:

print(p.is_file())

判断 p 是不是目录:

print(p.is_dir())

2.2 代码实现

思路:给出一个路径,判断是否为文件,如果是,则字符串拼接;否则,字符串拼接并且递归查询该目录下的文件。字符串拼接的时候以缩进来显示层次结构。

tree_str = ''

def generate_tree(pathname, n=0):
    global tree_str
    if pathname.is_file():
        tree_str += '    |' * n + '-' * 4 + pathname.name + '\n'
    elif pathname.is_dir():
        tree_str += '    |' * n + '-' * 4 + \
            str(pathname.relative_to(pathname.parent)) + '\\' + '\n'
        for cp in pathname.iterdir():
            generate_tree(cp, n + 1)

if __name__ == '__main__':
    generate_tree(Path.cwd())
    print(tree_str)

输出结果:

----PythonApplication\
    |----.ipynb_checkpoints\
    |    |----01_generate_tree-checkpoint.ipynb
    |----01_generate_tree.ipynb

2.3 改进,显示指定目录

上述程序有一个缺点,就是执行时只能显示程序文件所在目录的目录树结构,想要生成其目录的目录树结构就需要将其拷贝到那个目录执行。这样很不方便,我们可以利用命令参数将目标路径传递给程序,然后进行显示。上述generate_tree() 不需要修改。执行部分改一下:

if __name__ == '__main__':
    # 命令参数个数为2并且目录存在存在
    if len(sys.argv) == 2 and Path(sys.argv[1]).exists():
        generate_tree(Path(sys.argv[1]), 0)
    else: # 当前路径
        generate_tree(Path.cwd(), 0)
    print(tree_str)

修改以后,可以在命令行中添加目录参数了:

python dirtree.py E:\Programming\Python\applications

执行结果如图所示:

2.4 改进,保存文本文件

以上实现了在控制台打印的功能,但是缺少保存文件的功能,没关系,下面就来实现。

定义保存文件函数:

def save_file(tree, filename='tree.txt'):
    with open(filename, 'w', encoding='utf-8') as f:
        f.write(tree)

修改命令行参数解析部分:

if __name__ == '__main__':
        # 命令参数个数为2并且目录存在存在
    if len(sys.argv) == 2 and Path(sys.argv[1]).exists():
        generate_tree(Path(sys.argv[1]), 0)
    # 命令参数个数为3并且目录存在存在
    if len(sys.argv) == 3 and Path(sys.argv[1]).exists():
        generate_tree(Path(sys.argv[1]), 0)
        save_file(tree_str, sys.argv[2])
    else:  # 当前路径
        generate_tree(Path.cwd(), 0)
    print(tree_str)

修改完毕之后,可以使用下面命令测试:

python dirtree.py E:\Programming\Python\applications dirtree.txt

执行完之后就会在该目录下生成 dirtree.txt 文件。

2.5 改进,封装

上述功能已经实现,但是用到了全局变量,既然是一个完整的功能不如封装成一个类。

# -*- coding: utf-8 -*-
import sys
from pathlib import Path


class DirectionTree(object):
    """生成目录树
    @ pathname: 目标目录
    @ filename: 要保存成文件的名称
    """

    def __init__(self, pathname='.', filename='tree.txt'):
        super(DirectionTree, self).__init__()
        self.pathname = Path(pathname)
        self.filename = filename
        self.tree = ''

    def set_path(self, pathname):
        self.pathname = Path(pathname)

    def set_filename(self, filename):
        self.filename = filename

    def generate_tree(self, n=0):
        if self.pathname.is_file():
            self.tree += '    |' * n + '-' * 4 + self.pathname.name + '\n'
        elif self.pathname.is_dir():
            self.tree += '    |' * n + '-' * 4 + \
                str(self.pathname.relative_to(self.pathname.parent)) + '\\' + '\n'

            for cp in self.pathname.iterdir():
                self.pathname = Path(cp)
                self.generate_tree(n + 1)

    def save_file(self):
        with open(self.filename, 'w', encoding='utf-8') as f:
            f.write(self.tree)


if __name__ == '__main__':
    dirtree = DirectionTree()
    # 命令参数个数为1,生成当前目录的目录树
    if len(sys.argv) == 1:
        dirtree.set_path(Path.cwd())
        dirtree.generate_tree()
        print(dirtree.tree)
    # 命令参数个数为2并且目录存在存在
    elif len(sys.argv) == 2 and Path(sys.argv[1]).exists():
        dirtree.set_path(sys.argv[1])
        dirtree.generate_tree()
        print(dirtree.tree)
    # 命令参数个数为3并且目录存在存在
    elif len(sys.argv) == 3 and Path(sys.argv[1]).exists():
        dirtree.set_path(sys.argv[1])
        dirtree.generate_tree()
        dirtree.set_filename(sys.argv[2])
        dirtree.save_file()
    else:  # 参数个数太多,无法解析
        print('命令行参数太多,请检查!')

同样可以使用以下三条命令进行测试:

  • python dirtree.py :打印当前目录的目录树;

  • python dirtree.py E:\Programming\Python\applications :打印指定目录的目录树;

  • python dirtree.py E:\Programming\Python\applications dirtree.txt :打印指定目录的目录树并保存成文件。

3、其他想法

本来在改进部分还想要生成图片,但是经过一番测试遇到以下问题:

  • 使用 PIL 库把目录树转换为图片:该库在生成图片的时候要指定图片的大小,我们知道目录树结构根据文件夹内容不定长度和高度,所以需要动态计算长度和高度。

  • 使用 Pygame 库把目录树转换为图片:该库可以自适应宽度,但是不能识别换行符,所以最后生成的图片只有一行。

思路:

可以把目录树的每一行都生成一个图片,最后进行拼接,理论上可行,没有进行测试,有兴趣的可以尝试。

— End —

更多Python视频、源码、资料加群725638078免费获取

原文链接:https://juejin.im/post/5af1080a5188256727745b7d?

  • 16
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: TensorFlow 2.0的设计理念是简单粗暴,旨在提供更加直观、易用的编程体验,让用户更快速地构建、训练和部署机器学习模型。以下是TensorFlow 2.0的简单粗暴特性: 1. 动态图计算:TensorFlow 2.0默认采用动态图计算方式,即使用即定义计算图。这使得用户能够像编写Python代码一样自然地构建和调试模型,无需担心图构建过程中的繁琐细节。 2. Keras集成:TensorFlow 2.0将Keras作为其高级神经网络API的标准前端,实现了更加简洁、易懂的模型构建和训练接口。用户无需再额外安装和配置Keras,而且可以直接利用Keras强大的功能,如模型序列化、多种损失函数和优化器等。 3. 切换模式:TensorFlow 2.0提供了一个方便的转换工具,用户可以将TensorFlow 1.x的代码迁移到2.0版本,以享受新的特性,无需重写整个代码。这种平滑迁移的设计使得用户更容易接受新版本并从中受益。 4. Eager Execution(即时执行):TensorFlow 2.0中的Eager Execution模式使得用户可以逐行执行模型代码并立即返回结果,这有助于快速验证和调试模型,尤其对于初学者来说更容易上手。 5. SavedModel格式:TensorFlow 2.0引入了SavedModel格式作为模型的默认保存格式,该格式具有更好的跨平台和版本控制的兼容性。用户能够更方便地保存和分享自己的模型,同时也能更好地与其他TensorFlow开发者进行模型交流。 总之,TensorFlow 2.0的简单粗暴特性使得机器学习的开发变得更加直观、高效,并能够吸引更多的开发者加入到机器学习的领域中。 ### 回答2: TensorFlow 2.0是一种简单粗暴的机器学习框架。相较于以往版本,2.0在易用性、灵活性和效率方面都有很大的提升。 首先,TensorFlow 2.0引入了eager execution(即即时执行),这意味着我们可以像编写Python代码一样编写和运行TensorFlow操作,而无需定义计算图。这样可以更容易地调试和理解代码,使得开发过程更加直观和高效。 其次,TensorFlow 2.0取消了许多低级API,如tf.Session和tf.placeholder,大大减少了代码的复杂度。取而代之的是一些更高级且易用的API,如tf.keras,它提供了一个简单而且强大的接口来构建神经网络模型。我们可以使用一些简单的函数调用来定义和训练模型,从而减少了样板代码,同时还能保持高度的灵活性。 此外,TensorFlow 2.0还提供了一个称为tf.data的新的高性能数据输入管道。我们可以使用tf.data.Dataset将数据集导入模型中,并进行预处理、批处理等操作,以便更好地利用硬件资源,并实现更高效的训练过程。 最后,TensorFlow 2.0充分利用了现代硬件的加速能力,如GPU和TPU。它使用了tf.function装饰器来自动转换函数为高性能的图执行模式,并支持分布式训练,以便在分布式系统上进行大规模的模型训练。 综上所述,TensorFlow 2.0确实是一种简单粗暴的机器学习框架。它简化了开发过程,提高了代码的可读性和可维护性,并利用了现代硬件的优势,从而大大提升了训练效率和性能。无论是初学者还是有经验的开发者,都可以受益于这个强大而易用的框架。 ### 回答3: 简单粗暴的TensorFlow 2.0是一个更新版本的Google开源机器学习框架,旨在让使用变得更加简便。TensorFlow 2.0采用了Eager Execution模式,移除了一些繁琐的操作,与Python的语义更加契合。这使得建立和训练神经网络变得更加直观和容易。 TensorFlow 2.0引入了Keras作为其主要高级API,将其整合为TensorFlow的一部分。Keras提供了丰富而直观的高级API,可以方便地构建各种神经网络模型。通过将Keras集成到TensorFlow中,使用者可以轻松地创建、训练和部署深度学习模型。 TensorFlow 2.0还引入了tf.function装饰器,允许将普通Python函数转换为高效的TensorFlow图,加速模型的训练和推理过程。 此外,TensorFlow 2.0对于分布式训练、模型部署和端到端生态系统的支持都有所改进。它提供了更好的工具和接口,使得分布式机器学习变得更加容易。TensorFlow 2.0还支持模型在移动设备、Web和边缘设备上部署,并提供了可拓展的生态系统,包括TensorFlow Hub、TensorBoard和TensorFlow.js等。 总之,简单粗暴的TensorFlow 2.0通过增强开发者的体验和提供更加直观的API,大大简化了神经网络的构建和训练过程。新版本的引入了许多新特性和改进,使得TensorFlow 2.0成为构建高性能、可扩展的机器学习模型的理想选择。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值